#!/usr/bin/env python3.10
# -*- encoding: utf-8 -*-
"""
@File    :   tools.py
@Time    :   2024/01/04 14:40:53
@Author  :   windstarry 
@Version :   1.0
"""
# here put the import lib
from django.db import models
import os
import base64
from io import BytesIO
from PIL import Image


def custom_model_to_dict(instance):
    # 获取模型的元数据
    opts = instance._meta
    # 创建一个空字典用于存储数据
    data = {}
    # 遍历模型的字段列表
    for f in opts.concrete_fields + opts.many_to_many:
        # 判断字段类型是否为DateTimeField
        if isinstance(f, models.DateTimeField):
            # 将DateTimeField类型的字段转换为ISO格式的字符串，并将字段名和转换后的值存入字典
            data[f.name] = getattr(instance, f.name).isoformat()
        else:
            # 将其他字段的值从对象中取出，并将字段名和值存入字典
            data[f.name] = f.value_from_object(instance)
    # 返回存储所有字段的字典
    return data


def media_file_name(instance, filename):
    """
    生成媒体文件名
    Args:
        instance: 实例对象
        filename: 原始文件名
    Returns:
        生成的文件路径
    """
    h = instance.md5sum
    basename, ext = os.path.splitext(filename)
    return os.path.join("files", h[0:1], h[1:2], h + ext.lower())


import base64
from PIL import Image
from io import BytesIO

def image_to_base64(image_path):
    # 加载图像文件
    with Image.open(image_path) as img:
        # 创建一个字节流管道
        byte_data = BytesIO()
        # 保存图像到字节流管道
        img.save(byte_data, format="JPEG")
        # 重要步骤：将字节流管道的指针重置到文件开始位置，以便后续操作
        byte_data.seek(0)
        # prefix = "data:image/jpeg;base64,"
        # 将字节数据直接编码成base64字符串，无需先转换为bytes
        base64_str = base64.b64encode(byte_data.getvalue()).decode("utf-8")
    return base64_str
